iT邦幫忙

2024 iThome 鐵人賽

DAY 27
1

在本課中,我們將探索加密貨幣市場的獨特特性,並學習如何使用現代投資組合理論(MPT)來優化加密貨幣組合。我們還將深入探討優化算法,如蒙特卡洛模擬和遺傳算法,提供詳細的公式和實際示例,以增強我們的資產配置策略。最後,我們將使用Python和加密貨幣交易所的API來實現我們的交易策略。今日 Colab


一、引言

https://ithelp.ithome.com.tw/upload/images/20241011/20120549UsHYvNCPNe.jpg

1. 為什麼要進行加密貨幣組合優化?

  • 高波動性:加密貨幣以其高波動性而聞名,既帶來了機會也帶來了風險。
  • 多元化收益:將加密貨幣納入投資組合可以利用其與傳統資產的低相關性,潛在地提高收益。
  • 技術創新:支持加密貨幣的區塊鏈技術為投資和組合管理提供了新的途徑。

2. 本課目標

  • 了解加密貨幣市場的獨特特性。
  • 學習如何使用現代投資組合理論優化加密貨幣組合。
  • 深入應用優化算法,如蒙特卡洛模擬和遺傳算法,提供詳細的公式和示例。
  • 使用Python和加密貨幣交易所API實現和測試交易策略。

二、了解加密貨幣市場

1. 市場特性

  • 24/7交易:與傳統市場不同,加密貨幣市場全年無休,全天候交易。
  • 流動性:在不同的加密貨幣和交易所之間差異顯著。
  • 監管:相比傳統金融市場,監管較少,風險更高。

2. 主流加密貨幣

  • 比特幣(BTC):第一個也是最廣為人知的加密貨幣。
  • 以太坊(ETH):用於去中心化應用和智能合約的平台。
  • 其他山寨幣:如瑞波幣(XRP)、萊特幣(LTC)等。

3. 風險和考慮

  • 市場操縱:由於缺乏監管,存在價格操縱的可能性。
  • 安全風險:可能遭受黑客攻擊和盜竊。
  • 監管變化:突然的監管政策變化可能對價格產生重大影響。

三、現代投資組合理論(MPT)在加密貨幣中的應用

1. MPT概述

  • 目標:在給定風險水平下最大化投資組合收益,或在給定收益水平下最小化風險。
  • 假設:投資者是理性的,市場是有效的。

2. 計算期望收益和協方差

  • 期望收益:基於歷史數據的平均預期收益。

    https://ithelp.ithome.com.tw/upload/images/20241011/20120549AbEsRDhNBV.png

    • E(R_i):資產 i 的期望收益
    • R_{i,t}:資產 i 在時間 t 的收益
    • T:總觀測期數
  • 協方差矩陣:衡量資產收益如何共同變動。

    https://ithelp.ithome.com.tw/upload/images/20241011/20120549z2XNuM5laJ.png

    • \sigma_{ij}:資產 ij 的協方差

3. 有效前沿

  • 定義:在給定風險水平下提供最高預期收益的最優投資組合集合。
  • 可視化:在以風險(標準差)為 x 軸,預期收益為 y 軸的圖表上繪製的曲線。

4. 將MPT應用於加密貨幣

  • 挑戰
    • 高波動性:增加了整體風險。
    • 數據可用性:相比傳統資產,歷史數據較少。
  • 優勢
    • 多元化:由於與傳統資產的低相關性,可能改善投資組合表現。

四、優化算法

在本節中,我們將深入探討如何使用優化算法來改進加密貨幣投資組合的資產配置。我們將詳細介紹蒙特卡洛模擬和遺傳算法,並提供數學公式和實際示例,幫助您理解這些技術如何應用於投資組合優化。

1. 蒙特卡洛模擬

1.1 蒙特卡洛模擬的概念

蒙特卡洛模擬是一種利用隨機抽樣和統計模型來估計數學問題解決方案的方法。它特別適用於複雜的、多變量的問題,如投資組合優化。

1.2 在投資組合優化中的應用

目標:通過隨機生成大量的資產權重組合,計算每個組合的預期收益和風險,從而找到最優的投資組合。

1.3 數學公式

投資組合的預期收益

https://ithelp.ithome.com.tw/upload/images/20241011/2012054901yRk0Pnn3.png

  • E(R_p):投資組合的預期收益
  • w_i:資產 i 的權重
  • E(R_i):資產 i 的期望收益
  • n:資產的數量

投資組合的風險(標準差)

https://ithelp.ithome.com.tw/upload/images/20241011/201205495M7SE54HzL.png

  • \sigma_p:投資組合的標準差
  • \sigma_{ij}:資產 i 和資產 j 之間的協方差

夏普比率

https://ithelp.ithome.com.tw/upload/images/20241011/20120549EZsTd0Bxja.png

  • S:夏普比率
  • R_f:無風險利率

1.4 實際示例

假設:我們有三種加密貨幣資產:BTC、ETH 和 LTC。

步驟

  1. 收集歷史價格數據:獲取過去一年的每日收盤價。

  2. 計算每日收益率:使用價格數據計算每日收益率。

    https://ithelp.ithome.com.tw/upload/images/20241011/201205496NyXNNnRNh.png

    • R_{i,t}:資產 i 在時間 t 的收益率
    • P_{i,t}:資產 i 在時間 t 的價格
  3. 計算平均收益和協方差矩陣
    我們將創建一個假設值包含 5 天收益率的 DataFrame,數據為假設的每日收益率。

    import numpy as np
    import pandas as pd
    
    # 創建日期索引
    dates = pd.date_range('2022-01-01', periods=5)
    
    # 創建假設的每日收益率數據(以百分比表示)
    data = {
         'BTC': [0.02, -0.015, 0.01, 0.005, -0.01],
         'ETH': [0.025, -0.02, 0.015, 0.007, -0.012],
         'LTC': [0.015, -0.01, 0.005, 0.003, -0.008]
    }
    
    # 創建 DataFrame
    returns = pd.DataFrame(data, index=dates)
    print("資產收益率 DataFrame:")
    print(returns)
    
    

    我們用這個資料來做以下計算

    import numpy as np
    import pandas as pd
    
    # 假設 returns 是資產收益率的 DataFrame
    mean_returns = returns.mean()
    cov_matrix = returns.cov()
    
  4. 進行蒙特卡洛模擬

    num_portfolios = 50000
    results = np.zeros((3, num_portfolios))
    weights_record = []
    
    for i in range(num_portfolios):
        # 隨機生成資產權重
        weights = np.random.random(3)
        weights /= np.sum(weights)
        weights_record.append(weights)
    
        # 計算投資組合收益和風險
        portfolio_return = np.sum(mean_returns * weights)
        portfolio_std_dev = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
    
        # 計算夏普比率(假設無風險利率為 0)
        sharpe_ratio = portfolio_return / portfolio_std_dev
    
        # 保存結果
        results[0,i] = portfolio_std_dev
        results[1,i] = portfolio_return
        results[2,i] = sharpe_ratio
    
  5. 繪製有效前沿

    import matplotlib.pyplot as plt
    
    plt.figure(figsize=(10, 7))
    plt.scatter(results[0,:], results[1,:], c=results[2,:], cmap='viridis')
    plt.xlabel('風險(標準差)')
    plt.ylabel('預期收益')
    plt.colorbar(label='夏普比率')
    plt.show()
    

    可以得到以下圖形:
    https://ithelp.ithome.com.tw/upload/images/20241011/201205497WcIEl1CAd.png

  6. 找到最優投資組合

    # 將結果轉換為 DataFrame 以便於查看
     results_frame = pd.DataFrame(results.T, columns=['標準差', '預期收益', '夏普比率'])
    
     # 找到夏普比率最大的投資組合
     max_sharpe_idx = results_frame['夏普比率'].idxmax()
     optimal_std_dev = results_frame.loc[max_sharpe_idx, '標準差']
     optimal_return = results_frame.loc[max_sharpe_idx, '預期收益']
     optimal_weights = weights_record[max_sharpe_idx]
    
     print("最優投資組合權重:")
     print("BTC:", round(optimal_weights[0], 4))
     print("ETH:", round(optimal_weights[1], 4))
     print("LTC:", round(optimal_weights[2], 4))
     print("\n對應的預期收益:", round(optimal_return, 4))
     print("對應的風險(標準差):", round(optimal_std_dev, 4))
     print("對應的夏普比率:", round(results_frame.loc[max_sharpe_idx, '夏普比率'], 4))
    
    

    可以得到:

    https://ithelp.ithome.com.tw/upload/images/20241011/20120549KLNTkd8kES.png

解釋

  • 我們隨機生成了 50,000 個不同的投資組合權重。
  • 計算每個組合的預期收益、風險和夏普比率。
  • 通過比較夏普比率,找到最優的投資組合。

1.5 優缺點

  • 優點
    • 簡單易行,易於實現。
    • 能夠探索廣泛的權重組合空間。
  • 缺點
    • 隨機性較高,可能需要大量的模擬次數。
    • 無法保證找到全局最優解。

2. 遺傳算法

2.1 遺傳算法的概念

遺傳算法(Genetic Algorithm)是一種模仿自然進化過程的隨機搜索算法。它通過選擇、交叉和變異等操作,不斷優化候選解,以找到全局最優解。

2.2 在投資組合優化中的應用

目標:優化資產權重,使投資組合的夏普比率最大化。

2.3 算法步驟

  1. 初始種群:隨機生成一組投資組合(個體),每個個體由資產權重組成。

  2. 適應度評估:計算每個個體的適應度函數(例如,夏普比率)。

  3. 選擇:根據適應度選擇優秀的個體作為父代。

  4. 交叉:結合兩個父代個體的特徵,產生新的子代個體。

  5. 變異:對子代個體進行隨機變異,以增加多樣性。

  6. 更新種群:將子代個體加入種群,並根據適應度選擇下一代種群。

  7. 重複步驟 2-6,直到滿足停止條件(如達到最大代數或適應度不再提升)。

2.4 數學公式

適應度函數(以夏普比率為例)

https://ithelp.ithome.com.tw/upload/images/20241011/20120549l17ZCimfiB.png

  • E(R_p):投資組合的預期收益
  • \sigma_p:投資組合的標準差
  • R_f:無風險利率

2.5 實際示例

我們將使用與蒙特卡洛模擬相同的示例數據,來展示如何應用遺傳算法進行投資組合優化。

步驟 1:準備數據

我們已經有了資產收益率 DataFrame returns、平均收益 mean_returns 和協方差矩陣 cov_matrix

# returns, mean_returns, cov_matrix 已在前面計算
步驟 2:設置遺傳算法環境

我們將使用 DEAP 庫來實現遺傳算法。官網

https://ithelp.ithome.com.tw/upload/images/20241011/20120549UqkxIeHesR.png

from deap import base, creator, tools, algorithms

# 定義評估函數,目標是最大化夏普比率
def evaluate_individual(individual):
    weights = np.array(individual)
    portfolio_return = np.sum(mean_returns * weights)
    portfolio_std_dev = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
    if portfolio_std_dev == 0:
        return 0,
    sharpe_ratio = portfolio_return / portfolio_std_dev
    return sharpe_ratio,

# 創建 Fitness 和 Individual 類型
creator.create('FitnessMax', base.Fitness, weights=(1.0,))
creator.create('Individual', list, fitness=creator.FitnessMax)

# 設置工具箱
toolbox = base.Toolbox()
toolbox.register('attr_float', np.random.random)

# 定義個體:隨機生成權重,並確保總和為 1
def create_individual():
    weights = [np.random.random() for _ in range(len(mean_returns))]
    total = sum(weights)
    weights = [w / total for w in weights]
    return creator.Individual(weights)

toolbox.register('individual', create_individual)
toolbox.register('population', tools.initRepeat, list, toolbox.individual)

# 遺傳操作
toolbox.register('evaluate', evaluate_individual)
toolbox.register('mate', tools.cxBlend, alpha=0.5)
toolbox.register('mutate', tools.mutGaussian, mu=0, sigma=0.1, indpb=0.2)
toolbox.register('select', tools.selTournament, tournsize=3)
步驟 3:運行遺傳算法
# 參數設置
population_size = 50
num_generations = 50
crossover_prob = 0.7
mutation_prob = 0.2

# 初始化種群
population = toolbox.population(n=population_size)

# 記錄最優解
hall_of_fame = tools.HallOfFame(1)

# 統計信息
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("max", np.max)
stats.register("avg", np.mean)

# 運行遺傳算法
population, logbook = algorithms.eaSimple(population, toolbox, cxpb=crossover_prob, mutpb=mutation_prob,
                                          ngen=num_generations, stats=stats, halloffame=hall_of_fame, verbose=True)

輸出示例

https://ithelp.ithome.com.tw/upload/images/20241011/20120549Lj7M5J09WU.png

步驟 4:獲取最優投資組合
# 最優個體
best_individual = hall_of_fame[0]
optimal_weights = np.array(best_individual)
portfolio_return = np.sum(mean_returns * optimal_weights)
portfolio_std_dev = np.sqrt(np.dot(optimal_weights.T, np.dot(cov_matrix, optimal_weights)))
sharpe_ratio = portfolio_return / portfolio_std_dev if portfolio_std_dev != 0 else 0

print("最優投資組合權重:")
print("BTC:", round(optimal_weights[0], 4))
print("ETH:", round(optimal_weights[1], 4))
print("LTC:", round(optimal_weights[2], 4))
print("\n對應的預期收益:", round(portfolio_return, 4))
print("對應的風險(標準差):", round(portfolio_std_dev, 4))
print("對應的夏普比率:", round(sharpe_ratio, 4))

輸出示例(結果可能因隨機性而異):

https://ithelp.ithome.com.tw/upload/images/20241011/20120549f0TUQul9d5.png

解釋

  • 初始化:我們創建了一個種群,每個個體代表一組資產權重。
  • 適應度評估:計算每個個體的夏普比率作為適應度。
  • 遺傳操作:通過交叉和變異產生新的個體,增加多樣性。
  • 演化:重複這個過程多代,以找到最優的投資組合。

2.6 優缺點

  • 優點
    • 適合複雜的優化問題,具有全局搜索能力。
    • 能夠處理非線性、非凸優化問題。
  • 缺點
    • 實現較為複雜,需要細緻的參數調整。
    • 計算時間較長,特別是對於大的種群和代數。

3. 比較兩種方法

3.1 蒙特卡洛模擬

  • 適用性:簡單,適合初學者和小型投資組合。
  • 效率:可能需要大量模擬次數才能接近最優解。

3.2 遺傳算法

  • 適用性:適合複雜、高維度的優化問題。
  • 效率:在尋找全局最優解方面更有效,但計算資源需求較高。

3.3 選擇建議

  • 小型投資組合:蒙特卡洛模擬可能更為高效。
  • 大型投資組合:遺傳算法可能更適合,因為它能更有效地探索高維度的搜索空間。

五、使用Python和加密貨幣交易所API

1. 環境設置

  • 所需庫
    • pandasnumpy:用於數據處理。
    • matplotlibseaborn:用於數據可視化。
    • ccxt:用於訪問加密貨幣交易所API。官網
    • scipy.optimize:用於優化算法。
    • deap:用於遺傳算法。官網

2. 收集數據

https://ithelp.ithome.com.tw/upload/images/20241011/20120549JGlJiCmh3r.png

  • 使用ccxt
    • 支持多個交易所,如幣安、Coinbase、Kraken等。
    • 允許獲取歷史OHLCV(開、高、低、收、成交量)數據。
import ccxt
import pandas as pd

exchange = ccxt.binance()
symbols = ['BTC/USDT', 'ETH/USDT', 'LTC/USDT']
data = {}

for symbol in symbols:
    ohlcv = exchange.fetch_ohlcv(symbol, timeframe='1d', limit=365)
    df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
    df.set_index('timestamp', inplace=True)
    data[symbol] = df['close']

3. 計算收益和協方差

prices = pd.DataFrame(data)
returns = prices.pct_change().dropna()
mean_returns = returns.mean()
cov_matrix = returns.cov()

4. 使用MPT進行投資組合優化

(a) 定義優化函數

import numpy as np
from scipy.optimize import minimize

def portfolio_performance(weights, mean_returns, cov_matrix):
    returns = np.sum(mean_returns * weights)
    std = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
    return std, returns

def negative_sharpe_ratio(weights, mean_returns, cov_matrix, risk_free_rate=0):
    std, returns = portfolio_performance(weights, mean_returns, cov_matrix)
    sharpe_ratio = (returns - risk_free_rate) / std
    return -sharpe_ratio

(b) 約束條件和邊界

num_assets = len(symbols)
args = (mean_returns, cov_matrix)
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = tuple((0,1) for asset in range(num_assets))

(c) 執行優化

result = minimize(negative_sharpe_ratio, num_assets*[1./num_assets,], args=args,
                  method='SLSQP', bounds=bounds, constraints=constraints)
optimal_weights = result.x

5. 使用蒙特卡洛模擬進行投資組合優化

(此部分已在第四節詳細介紹)

6. 使用遺傳算法進行投資組合優化

(此部分已在第四節詳細介紹)

7. 使用交易所API執行交易

  • 下單
    • 市價單:以當前最優價格立即買入或賣出。
    • 限價單:以指定價格或更優價格買入或賣出。
  • 使用ccxt的示例
symbol = 'BTC/USDT'
amount = 0.001  # 示例數量
order = exchange.create_order(symbol, 'market', 'buy', amount)
print(order)
  • 處理API密鑰
    • 安全地存儲和加載您的API密鑰。
    • 使用環境變量或加密存儲。
exchange.apiKey = '您的API密鑰'
exchange.secret = '您的秘密密鑰'

六、風險管理和監控

1. 風險管理策略

  • 止損單:當資產達到某個價格時自動賣出。
  • 止盈單:當資產達到預期利潤水平時自動賣出。
  • 多元化:將投資分散到不同資產,以降低風險。

2. 性能監控

  • 跟蹤投資組合價值:定期檢查投資組合的總價值。
  • 再平衡:定期調整投資組合權重,維持預期配置。
  • 日誌記錄和報告:詳細記錄所有交易和投資組合變化。

七、總結

1. 關鍵要點

  • 加密貨幣市場為投資組合優化提供了獨特的機會和挑戰。
  • 現代投資組合理論可以應用於加密貨幣,但由於高波動性和獨特的市場條件,可能需要調整。
  • 優化算法,如蒙特卡洛模擬和遺傳算法,可以增強投資組合優化效果。
  • Python和交易所API使自動化交易和投資組合管理成為可能。

2. 下一步

  • 深化理解:探索更高級的優化技術和風險管理策略。
  • 擴展資產範圍:納入更多加密貨幣,甚至是代幣化的傳統資產。
  • 進一步自動化:開發具有實時數據處理能力的全自動交易機器人。

八、作業

  1. 數據收集:收集至少五種不同加密貨幣過去一年的歷史價格數據。
  2. 投資組合優化:使用收集的數據,應用MPT找到最優的投資組合配置。
  3. 算法比較:比較使用蒙特卡洛模擬和遺傳算法進行投資組合優化的結果,並討論它們的優缺點。
  4. 實施交易策略:使用Python和交易所API,模擬基於優化投資組合的交易。
  5. 風險分析:評估您的投資組合的潛在風險,並提出風險緩解策略。

提示

  • 數據質量:確保您收集的數據是完整且沒有缺失值的。
  • API速率限制:注意交易所的API速率限制,避免被封禁。
  • 回測:在實施任何交易策略之前,使用歷史數據進行回測以評估其性能。
  • 安全性:切勿分享您的API密鑰,考慮使用測試網或沙盒環境進行實驗。

免責聲明

  • 波動性警告:加密貨幣市場波動性極高,可能導致重大財務損失。
  • 合規性:確保您的交易活動符合所有適用的法律法規。
  • 教育目的:提供的內容僅用於教育目的,不構成投資建議。

通過本課的學習,應該對如何將投資組合優化技術應用於加密貨幣,以及如何使用Python和交易所API實現這些策略有了扎實的理解。


上一篇
Day25:期貨期權量化對沖策略以及風險&資金管理
下一篇
Day27:交易策略的部署、實時交易與監控
系列文
打開就會 AI 與數據分析的投資理財術30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言